package cn.tpshion.config.common;

import lombok.Data;
import java.io.Serializable;

/**
 * 响应数据返回类
 * 主要为了同意数据返回格式
 * 格式：
 * {
 *     "code": 00,
 *     "msg": "ok",
 *     "data": {
 *         "name": "示例"
 *     }
 * }
 */
@Data
public class R<T> implements Serializable {

    private static final long serialVersionUID = 6795007433716023395L;

    private String code;

    private String msg;

    private T data;

    public R(String code, String msg, T data){
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> R withErrorCode(ErrorCode errorCode, T data){
        return new R(errorCode.getCode(),errorCode.getMsg(),data);
    }

    /**
     * 不带数据的成功返回
     * @return
     */
    public static R success(){
        return success(null);
    }

    /**
     * 自定义消息的成功返回
     * @param msg
     * @return
     */
    public static R ok(String msg){
        return new R(ErrorCode.OK.getCode(), msg, null);
    }

    /**
     * 带数据的成功返回
     * @param data
     * @param <T>
     * @return
     */
    public static <T> R success(T data){
        return withErrorCode(ErrorCode.OK, data);
    }

    public static <T> R success(T data,String msg){
        return new R(ErrorCode.OK.getCode(), msg, data);
    }

    /**
     * 直接使用定义好的错误码返回
     * @param errorCode
     * @return
     */
    public static R fail(ErrorCode errorCode){
        return withErrorCode(errorCode, null);
    }

    /**
     * 使用定义好的错误码，以及自定义的错误信息返回
     * @param errorCode
     * @param msg
     * @return
     */
    public static R fail(ErrorCode errorCode, String msg){
        return new R(errorCode.getCode(), msg, null);
    }

    /**
     * 通用错误码返回
     * @param msg
     * @return
     */
    public static R fail(String msg){
        return new R(ErrorCode.FAIL.getCode(), msg, null);
    }
}
